// websocket基础地址
function getBaseUrl () {
  return process.env.VUE_APP_WS_BASE
}

function WebSocketClient () {
  this.socket = null
  this.connTimer = null
  this.heartTimer = null
  this.closeTimer = null
}

// 发送心跳，间隔5秒
WebSocketClient.prototype.addHeartTimer = function () {
  if (this.heartTimer) {
    clearInterval(this.heartTimer)
  }
  this.heartTimer = setInterval(() => {
    this.socket.send('heart')
  }, 5000)
}

// 开启定时监测心跳，15秒内没有收到正常心跳则关闭连接，并标注异常
WebSocketClient.prototype.addCloseTimer = function () {
  if (this.closeTimer) {
    clearTimeout(this.closeTimer)
  }
  this.closeTimer = setTimeout(() => {
    this.socket.close()
  }, 15000)
}

// 重新连接，间隔30秒
WebSocketClient.prototype.addReconnectTimer = function (clientId, msgCallback, initCallback) {
  if (this.connTimer) {
    clearInterval(this.connTimer)
  }
  this.connTimer = setInterval(() => {
    console.log('尝试重新连接')
    this.conn(clientId, msgCallback, initCallback)
  }, 30000)
}

WebSocketClient.prototype.close = function () {
  this.socket.close()
}

WebSocketClient.prototype.sendMsg = function (msg) {
  this.socket.send(msg)
}

WebSocketClient.prototype.isOk = function () {
  return this.socket && this.socket.readyState === 1
}

// 连接websocket服务端
WebSocketClient.prototype.conn = function (clientId, msgCallback, initCallback) {
  const wsUrl = getBaseUrl() + '/ws/' + clientId // 传递用户名
  this.socket = new WebSocket(wsUrl)
  // 打开socket通道事件
  this.socket.onopen = () => {
    console.log('连接成功')
    if (initCallback) {
      initCallback()
    }
    if (this.connTimer) {
      // 关闭重连
      clearInterval(this.connTimer)
    }
    // 发送心跳
    this.addHeartTimer()
    // 如果15秒内心跳未返回则断开链接
    this.addCloseTimer()
  }
  // 接收到消息事件
  this.socket.onmessage = res => {
    // 如果消息是心跳
    if (res.data === 'heart copy') {
      console.log('服务端收到心跳')
      // 心跳机制，不做业务处理
      // 有心跳删除关闭连接定时器
      clearTimeout(this.closeTimer)
      // 删除当前定时器后在打开新的一个
      this.addCloseTimer()
    }
    // 如果消息是其他业务
    if (msgCallback) {
      msgCallback(res.data)
    }
  }
  // 连接关闭事件
  this.socket.onclose = res => {
    // 关闭心跳
    clearInterval(this.heartTimer)
    if (res.code === 1000) {
      // 正常关闭
      console.log('正常关闭连接')
    } else {
      // 非正常关闭  提示网络异常并开始重新链接
      console.log('网络异常，开始重连')
      // 开启重复重连机制
      this.addReconnectTimer(clientId, msgCallback, initCallback)
    }
  }
  // 发生异常
  this.socket.onerror = res => {
    console.log('发生错误', res)
  }
}
export default WebSocketClient
